perm filename CURFAI.FAI[SYS,HE] blob
sn#018685 filedate 1973-01-05 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 ENTRY COEF,ERROR,LOOP1,LOOP2
00005 00003 COMPUTE LEAST SQUARES ERROR OF FIT AND RETURN
00007 00004 GETMAX LOOP - RETURNS INDEX OF MAXIMUM DISTANCE FROM LINE
00009 00005 CUR2 LOOP - ACCUMULATES PARTIAL SUMS
00011 ENDMK
⊗;
ENTRY COEF,ERROR,LOOP1,LOOP2
TITLE CURFAI
;FAIL PROCEDURES FOR CURVE FITTER
;COMPUTE COEFFICIENTS OF AX+BY=C
COEF: HRLZ 11,-1(17); PICK UP ARRAY. X[1]-X[9] IN REGS 0-10
MOVEM 12,SAV12#
BLT 11,10
MOVE 11,5
FMPR 11,3
MOVE 12,1
FMPR 12,12
FSBR 11,12; S ← X[6]*X[4]-X[2]↑2
MOVE 12,5
FMPR 12,2
MOVE 13,0
FMPR 13,13
FSBR 12,13; Z ← X[6]*X[3]-X[1]↑2
CAMG 12,11
JRST L1
MOVE 6,5; Z>S
FMPR 6,4
MOVE 13,0
FMPR 13,1
FSBR 6,13
FDVR 6,12; A=X[7] ← (X[6]*X[5]-X[1]*X[2])/Z
MOVE 7,[-1.0]; B=X[8]
MOVE 10,0
FMPR 10,4
MOVE 13,1
FMPR 13,2
FSBR 10,13
FDVR 10,12; C=X[9] ← (X[1]*X[5]-X[2]*X[3])/Z
JRST L2
L1: MOVE 6,[-1.0]; Z≤S
MOVE 7,5
FMPR 7,4
MOVE 12,0
FMPR 12,1
FSBR 7,12
FDVR 7,11; B=X[8] ← (X[6]*X[5]-X[1]*X[2])/S
MOVE 10,4
FMPR 10,1
MOVE 12,0
FMPR 12,3
FSBR 10,12
FDVR 10,11; C=X[9] ← (X[5]*X[2]-X[1]*X[4])/S
L2: HRRZ 11,-1(17); PUT BACK ARRAY
MOVEI 12,10(11)
BLT 11,(12)
MOVE 12,SAV12
SUB 17,[XWD 2,2]
JRST @2(17)
;COMPUTE LEAST SQUARES ERROR OF FIT AND RETURN
ERROR: PUSH 17,-1(17); COMPUTE COEFFICIENTS
PUSHJ 17,COEF; SAVES AC12
MOVE 11,6; COEF LEFT ARRAY IN 0-10
FMPR 11,11; ASQ ← X[7]↑2
MOVE 12,7
FMPR 12,12; BSQ ← X[8]↑2
FMPR 11,2
FMPR 12,3
FADR 11,12; ERROR←ASQ*X[3]+BSQ*X[4]
MOVE 12,4
FMPR 12,7
FMPR 12,6
FSC 12,1
FADR 11,12; ERROR←ERROR+2*X[7]*X[8]*X[5]
MOVE 12,10
FMPR 12,12
FMPR 12,5
FADR 11,12; ERROR←ERROR+X[9]↑2*X[6]
MOVE 12,6
FMPR 12,0
MOVE 13,7
FMPR 13,1
FADR 12,13
FMPR 12,10
FSC 12,1
FSBR 11,12; ERROR←ERROR-2*X[9]*(X[7]*X[1]+X[8]*X[2])
MOVE 1,11; AND RETURN ERROR
MOVE 12,SAV12
SUB 17,[XWD 2,2]
JRST @2(17)
;GETMAX LOOP - RETURNS INDEX OF MAXIMUM DISTANCE FROM LINE
D←←0
A←←1
B←←2
C←←3
DENOM←←4
I←←5
DSTR←←6
DEND←←7
E←←10
J←←11
M←←12
IND←←13
LOOP1: MOVEM 12,SAV12
HRLZI 12,-11(17); BLT ARGUMENTS INTO 0-10
BLT 12,E
SETZM M; INITIALIZE MAXIMUM DISTANCE FOR TEST
MOVEI IND,-1(I); SET UP INDEX INTO ARRAY D
LSH IND,2; WITH LIMITS [1:DEND,1:4]
ADD IND,D
L3: AOS I; LOOP STARTS HERE, INCREMENT COUNT
CAIG I,(DEND); TEST FOR WRAP AROUND
JRST L4
MOVEI I,(DSTR); SET UP I AND IND FOR DSTR+1
MOVEI IND,-1(DSTR)
JRST L3-2
L4: ADDI IND,4; INCREMENT INDEX FOR NEXT X COORD
MOVE 14,(IND); GET X,Y IN 14 AND 15
MOVE 15,1(IND)
FMPR 14,A; COMPUTE DISTANCE FROM LINE AX+BY=C
FMPR 15,B
FADR 14,15
FADR 14,C
FDVR 14,DENOM
MOVMS 14
CAMG 14,M; TEST IF GREATER THAN MAXIMUM
JRST .+3
MOVE M,14; IF SO, SAVE NEW MAXIMUM FOR FUTURE TESTS
MOVEI J,(I); AND INDEX OF COORDINATES
CAIE I,(E); TEST FOR END OF LINE
JRST L3
MOVE 1,J; RETURN INDEX J
MOVE 12,SAV12
SUB 17,[XWD 12,12]
JRST @12(17)
;CUR2 LOOP - ACCUMULATES PARTIAL SUMS
D←←0
PT2←←7
DEND←←10
I←←11
LOOP2: MOVEM 12,SAV12
MOVE D,-5(17); GET ARRAY D
SETZM 1; CLEAR SUM ARRAY
MOVE 10,[XWD 1,2]
BLT 10,6
MOVE PT2,-3(17); GET SOME MORE ARGUMENTS
MOVE DEND,-2(17)
MOVE I,-4(17)
MOVEI 12,-1(11); SET UP INDEX INTO D
LSH 12,2; SAME COMMENTS HERE AS FOR LAST PROCEDURE
ADD 12,D
L6: AOS I; INCREMENT I
CAIG 11,(10); TEST FOR WRAP AROUND
JRST L7
MOVE 11,-1(17); AND SET POINTERS TO DSTR+1
MOVEI 12,-1(11)
JRST L6-2
L7: ADDI 12,4
MOVE 13,(12); GET X,Y IN 13 AND 14
MOVE 14,1(12)
FADR 1,13; SUM
FADR 2,14
MOVE 15,13
FMPR 15,14
FADR 5,15
FMPR 13,13
FMPR 14,14
FADR 3,13
FADR 4,14
FADR 6,[1.0]
CAIE PT2,(I); CHECK FOR END IF LINE
JRST L6
HRR 12,-6(17); STORE ARRAY
HRLI 12,1
MOVE 13,12
BLT 12,5(13)
MOVE 12,SAV12
SUB 17,[XWD 7,7]
JRST @7(17)
END